﻿Imports WSEntidades
Imports System.IO

''' <summary>
'''Clase para validar addenda comerciales 
''' </summary>
''' <remarks></remarks>
Public Class ValidaAddendasComerciales

    ''' <summary>
    ''' Metodo que valida información de Addenda MasFactura2
    ''' </summary>
    ''' <param name="Elementos">Array de String que contiene los elementos de la sección</param>
    ''' <param name="Resp">Lista de RespuestaPremium a la que se añadiran los errores</param>
    ''' <param name="exisMF">Variable de tipo boolean que indicara si existe la addenda MF</param>
    ''' <param name="Comprobante">Objeto de tipo Comprobante que contiene la información del CFDI</param>
    ''' <param name="currentCompr">Lista de Arrays de String que contiene la información adicional de las partidas</param>
    ''' <param name="AddMF">Objeto que contendra la información de la addenda MF</param>
    ''' <param name="pRutaLayout">Ruta en que se encuentra almacenado el Layout para generar el nombre del comprobante</param>
    ''' <remarks>Realiza consulta a base de datos para identificar que la addenda se encuentre activada</remarks>
    Public Shared Sub ValidaAddendaMF(ByVal Elementos As String(), ByRef Resp As List(Of RespuestaPremium), _
                                      ByRef exisMF As Boolean, ByVal Comprobante As Comprobante, _
                                      ByVal currentCompr As List(Of String()), _
                                      ByRef AddMF As MasFactur.AddMasFactura.DocumentoFacturaMasFactura, _
                                      ByVal pRutaLayout As String)
        Dim UtilAddMF As csUtilsAddenda = New csUtilsAddenda()
        Try
            If (Elementos(0) = "07") Then

                If (Elementos(1) = "CVEADD") Then
                    'Dim AddendaBE As AddendaBE = addendadal.getAddendaByDescripcion(Elementos(3), Comprobante.Emisor.rfc, Conexion)
                    'If (AddendaBE Is Nothing) Then
                    '    ValidaCFDi.AgregaRespuesta("07", 2, "La Addenda " & Elementos(3) & "no se encuentra registrada.", Resp)
                    'End If
                    If Not (UtilAddMF.ProcesaConfig(Elementos, Resp)) Then
                        exisMF = False
                    Else
                        exisMF = True
                    End If
                ElseIf (Elementos(1) = "ENCABEZADO") Then
                    If Not (UtilAddMF.ProcesaEncabezado(Elementos, Comprobante, _
                                                    Path.GetFileNameWithoutExtension(pRutaLayout), Resp, _
                                                    AddMF)) Then
                        exisMF = False
                    Else
                        exisMF = True
                    End If
                ElseIf (Elementos(1) = "EMISOR") Then
                    If Not (UtilAddMF.ProcesaEmisor(Elementos, Comprobante, Resp, AddMF)) Then
                        exisMF = False
                    Else
                        exisMF = True
                    End If
                ElseIf (Elementos(1) = "RECEPTOR") Then
                    If Not (UtilAddMF.ProcesaReceptor(Elementos, Comprobante, Resp, AddMF)) Then
                        exisMF = False
                    Else
                        exisMF = True
                    End If
                ElseIf (Elementos(1) = "DETALLE") Then
                    If Not (UtilAddMF.ProcesaConceptos(Elementos, currentCompr, Comprobante, Resp, _
                                                   AddMF)) Then
                        exisMF = False
                    Else
                        exisMF = True
                    End If
                ElseIf (Elementos(1) = "TOTALES") Then
                    If Not (UtilAddMF.ProcesaTotales(Elementos, Comprobante, Resp, AddMF)) Then
                        exisMF = False
                    Else
                        exisMF = True
                    End If
                Else
                    ValidaCFDi.AgregaRespuesta("07", 0, "El contenido del documento TXT no es correcto. alguno de los indicadores no corresponde a la seccion 07.", Resp)
                End If
            Else
                ValidaCFDi.AgregaRespuesta("07", 0, "El contenido del documento TXT no es correcto. La seccion 07 no corresponde con el formato especificado", Resp)
            End If
        Catch ex As Exception
            ValidaCFDi.AgregaRespuesta("07", 0, ex.Message, Resp)
        End Try
    End Sub

    ''' <summary>
    ''' Metodo que valida la información de Addenda Soriana
    ''' </summary>
    ''' <param name="Elementos">Array de String que contiene los elementos de la sección</param>
    ''' <param name="Resp">Lista de RespuestaPremium a la que se añadiran los errores</param>
    ''' <param name="exisSR">Variable de tipo boolean que indicara si existe la addenda SR</param>
    ''' <param name="Comprobante">Objeto de tipo Comprobante que contiene la información del CFDI</param>
    ''' <param name="addSR">Objeto que contendra la información de la addenda SR</param>
    ''' <param name="impuestos">Objeto que contiene la información de los impuestos</param>
    ''' <param name="cuentPed">Variable de tipo integer para indicar el numero de pedido</param>
    ''' <param name="cuentArt">Variable de tipo integer para indicar el numero de articulo</param>
    ''' <param name="currentCompr">Lista de Array de String que contiene la información adicional de las partidas</param>
    ''' <remarks>Realiza consulta a base de datos para identificar que la addenda se encuentre activada</remarks>
    Public Shared Sub ValidaAddendaSoriana(ByVal Elementos As String(), ByRef Resp As List(Of RespuestaPremium), _
                                           ByRef exisSR As Boolean, ByVal Comprobante As Comprobante, _
                                           ByVal addSR As SR.AddSorianaReverse.DocumentoFacturaSorianaReverse, _
                                           ByVal impuestos As ComprobanteImpuestos, ByRef cuentPed As Integer, _
                                           ByRef cuentArt As Integer, ByRef currentCompr As List(Of String()))
        Dim UtilAddSR As csUtilsAddendaSR = New csUtilsAddendaSR()
        Try
            If (Elementos(0) = "08") Then

                If (Elementos(1) = "CVEADD") Then
                    'Dim AddendaBE As AddendaBE = addendadal.getAddendaByDescripcion(Elementos(2), Comprobante.Emisor.rfc, Conexion)
                    'If (AddendaBE Is Nothing) Then
                    '    ValidaCFDi.AgregaRespuesta("08", 0, "La Addenda " & Elementos(2) & "no se encuentra registrada.", Resp)
                    'End If
                    If Not (UtilAddSR.ProcesaConfig(Elementos, Resp)) Then
                        exisSR = False
                    Else
                        exisSR = True
                    End If
                ElseIf (Elementos(1) = "REMISION") Then
                    Dim importeIEPS As Decimal = 0
                    Dim importeIVA As Decimal = 0
                    For Each trasladoIVA In impuestos.Traslados
                        If (trasladoIVA.impuesto = ComprobanteImpuestosTrasladoImpuesto.IVA) Then
                            importeIVA = importeIVA + trasladoIVA.importe
                        Else
                            importeIEPS = importeIEPS + trasladoIVA.importe
                        End If
                    Next
                    If Not (UtilAddSR.ProcesaRemision(Elementos, Comprobante, _
                                                    Resp, _
                                                    addSR, importeIEPS.ToString(), importeIVA.ToString())) Then
                        exisSR = False
                    Else
                        exisSR = True
                    End If
                ElseIf (Elementos(1) = "PEDIMENTO") Then
                    If Not (UtilAddSR.ProcesaPedimento(Elementos, Resp, addSR)) Then
                        exisSR = False
                    Else
                        exisSR = True
                    End If
                ElseIf (Elementos(1) = "PEDIDO") Then
                    If Not (UtilAddSR.ProcesaPedido(Elementos, Resp, addSR, cuentPed)) Then
                        exisSR = False
                    Else
                        cuentPed = cuentPed + 1
                        exisSR = True
                    End If
                ElseIf (Elementos(1) = "ARTICULO") Then
                    If Not (UtilAddSR.ProcesaArticulos(Elementos, Comprobante, Resp, _
                                                   addSR, cuentArt, currentCompr)) Then
                        exisSR = False
                    Else
                        cuentArt = cuentArt + 1
                        exisSR = True
                    End If
                Else
                    ValidaCFDi.AgregaRespuesta("08", 0, "El contenido del documento TXT no es correcto. alguno de los indicadores no corresponde a la seccion 08.", Resp)
                End If
            Else
                ValidaCFDi.AgregaRespuesta("08", 0, "El contenido del documento TXT no es correcto. La seccion 08 no corresponde con el formato especificado", Resp)
            End If
        Catch ex As Exception
            ValidaCFDi.AgregaRespuesta("08", 0, ex.Message, Resp)
        End Try
    End Sub

    ''' <summary>
    ''' Metodo que valida la información de la Addenda Santander
    ''' </summary>
    ''' <param name="Elementos">Array de String que contiene los elementos de la sección</param>
    ''' <param name="Resp">Lista de RespuestaPremium a la que se añadiran los errores</param>
    ''' <param name="Comprobante">Objeto de tipo Comprobante que contiene la información del CFDI</param>
    ''' <param name="exisSantander">Variable de tipo boolean para indicar si es la primera sección de la addenda</param>
    ''' <param name="addSantander">Objeto que contendra la información de la addenda Santander</param>
    ''' <remarks>Realiza consulta a base de datos para identificar que la addenda se encuentre activada</remarks>
    Public Shared Sub ValidaAddendaSantander(ByVal Elementos As String(), ByRef Resp As List(Of RespuestaPremium), _
                                             ByVal Comprobante As Comprobante, ByRef exisSantander As Boolean, _
                                             ByRef addSantander As Santander.TAddendaSantanderV1)
        Dim UtilAddSantander As csUtilsAddendaSantander = New csUtilsAddendaSantander()
        Try
            If (Elementos(0) = "10") Then
                If (Elementos(1) = "CVEADD") Then
                    'Dim AddendaBE = addendadal.getAddendaByDescripcion(Elementos(2), Comprobante.Emisor.rfc, Conexion)
                    'If (AddendaBE Is Nothing) Then
                    '    Throw New Exception("La Addenda " & Elementos(2) & "no se encuentra registrada.")
                    'End If
                    If Not (UtilAddSantander.ProcesaConfig(Elementos, Resp)) Then
                        exisSantander = False
                    Else
                        exisSantander = True
                    End If
                ElseIf (Elementos(1) = "INFOPAGO") Then
                    If Not (UtilAddSantander.ProcesaInfoPago(Elementos, Comprobante, Resp, addSantander)) Then
                        exisSantander = False
                    Else
                        exisSantander = True
                    End If
                ElseIf (Elementos(1) = "INFOEMISION") Then
                    If Not (UtilAddSantander.ProcesaInfoEmision(Elementos, Resp, addSantander)) Then
                        exisSantander = False
                    Else
                        exisSantander = True
                    End If
                ElseIf (Elementos(1) = "INMUEBLES") Then
                    If Not (UtilAddSantander.ProcesaInmuebles(Elementos, Resp, addSantander)) Then
                        exisSantander = False
                    Else
                        exisSantander = True
                    End If
                ElseIf (Elementos(1) = "BASILEA") Then
                    If Not (UtilAddSantander.ProcesaBasilea(Elementos, Resp, addSantander)) Then
                        exisSantander = False
                    Else
                        exisSantander = True
                    End If
                ElseIf (Elementos(1) = "CAMPOADIC") Then
                    If Not (UtilAddSantander.ProcesaCampoAdic(Elementos, Resp, addSantander)) Then
                        exisSantander = False
                    Else
                        exisSantander = True
                    End If
                Else
                    ValidaCFDi.AgregaRespuesta("10", 2, "El contenido del documento TXT no es correcto. alguno de los indicadores no corresponde a la seccion 10.", Resp)
                End If
            Else
                ValidaCFDi.AgregaRespuesta("10", 0, "El contenido del documento TXT no es correcto. La seccion 10 no corresponde con el formato especificado", Resp)
            End If
        Catch ex As Exception
            ValidaCFDi.AgregaRespuesta("10", 0, ex.Message, Resp)
        End Try
    End Sub

    ''' <summary>
    ''' Metodo que valida la información de la Addenda AMC
    ''' </summary>
    ''' <param name="Elementos">Array de String que contiene los elementos de la sección</param>
    ''' <param name="Resp">Lista de RespuestaPremium a la que se añadiran los errores</param>
    ''' <param name="comprobante">Objeto de tipo Comprobante que contiene la información del CFDI</param>
    ''' <param name="tipoCfd">Variable que contiene el tipo de Comprobante</param>
    ''' <param name="exisAMC">Variable de tipo boolean que indica si es la primera sección de la addenda</param>
    ''' <param name="addAMC">Objeto que contendra la información de la addenda AMC</param>
    ''' <param name="CuentArtAMC">Variable que indica el numero de articulo</param>
    ''' <param name="currentCompr">Lista de Arrays de String que contiene la información adicional de las partidas</param>
    ''' <remarks>Realiza consulta a base de datos para identificar que la addenda se encuentre activada</remarks>
    Public Shared Sub ValidaAddendaAMC(ByVal Elementos As String(), ByRef Resp As List(Of RespuestaPremium), _
                                       ByVal comprobante As Comprobante, ByVal tipoCfd As String, _
                                       ByRef exisAMC As Boolean, ByRef addAMC As AMC71.ComprobanteAddenda, _
                                       ByRef CuentArtAMC As Integer, ByRef currentCompr As List(Of String()))
        Dim UtilsAddAMC As csUtilsAddendaAMC = New csUtilsAddendaAMC()
        Try
            If (Elementos(0) = "12") Then
                If (Elementos(1) = "CVEADD") Then
                    'Dim AddendaBE As AddendaBE = addendadal.getAddendaByDescripcion(Elementos(2), comprobante.Emisor.rfc, Conexion)
                    'If (AddendaBE Is Nothing) Then
                    '    ValidaCFDi.AgregaRespuesta("12", 0, "La Addenda " & Elementos(2) & "no se encuentra registrada.", Resp)
                    'End If
                    If Not (UtilsAddAMC.ProcesaConfig(Elementos, Resp)) Then
                        exisAMC = False
                    Else
                        exisAMC = True
                    End If
                ElseIf (Elementos(1) = "SimpleInvoiceType") Then
                    If Not (UtilsAddAMC.ProcesaEncabezado(Elementos, Resp, addAMC, tipoCfd, comprobante)) Then
                        exisAMC = False
                    Else
                        exisAMC = True
                    End If
                ElseIf (Elementos(1) = "SPECIALINS") Then
                    If Not (UtilsAddAMC.ProcesaSpecialIns(Elementos, Resp, addAMC)) Then
                        exisAMC = False
                    Else
                        exisAMC = True
                    End If
                ElseIf (Elementos(1) = "ORDERID") Then
                    If Not (UtilsAddAMC.ProcesaOrder(Elementos, Resp, addAMC)) Then
                        exisAMC = False
                    Else
                        exisAMC = True
                    End If
                ElseIf (Elementos(1) = "ADDITIONALINF") Then
                    If Not (UtilsAddAMC.ProcesaAditional(Elementos, Resp, addAMC)) Then
                        exisAMC = False
                    Else
                        exisAMC = True
                    End If
                ElseIf (Elementos(1) = "DELIVERYNOTE") Then
                    If Not (UtilsAddAMC.ProcesaDeliveryNote(Elementos, Resp, addAMC)) Then
                        exisAMC = False
                    Else
                        exisAMC = True
                    End If
                ElseIf (Elementos(1) = "BUYER") Then
                    If Not (UtilsAddAMC.ProcesaBuyer(Elementos, Resp, addAMC)) Then
                        exisAMC = False
                    Else
                        exisAMC = True
                    End If
                ElseIf (Elementos(1) = "SELLER") Then
                    If Not (UtilsAddAMC.ProcesaSeller(Elementos, Resp, addAMC)) Then
                        exisAMC = False
                    Else
                        exisAMC = True
                    End If
                ElseIf (Elementos(1) = "SHIPTO") Then
                    If Not (UtilsAddAMC.ProcesaShipto(Elementos, Resp, addAMC)) Then
                        exisAMC = False
                    Else
                        exisAMC = True
                    End If
                ElseIf (Elementos(1) = "INVOICECREATOR") Then
                    If Not (UtilsAddAMC.ProcesaInvoiceCreator(Elementos, Resp, addAMC)) Then
                        exisAMC = False
                    Else
                        exisAMC = True
                    End If
                ElseIf (Elementos(1) = "CUSTOMS") Then
                    If Not (UtilsAddAMC.ProcesaCustoms(Elementos, Resp, addAMC)) Then
                        exisAMC = False
                    Else
                        exisAMC = True
                    End If
                ElseIf (Elementos(1) = "CURRENCY") Then
                    If Not (UtilsAddAMC.ProcesaCurrency(Elementos, Resp, _
                                                   addAMC, comprobante.Moneda, comprobante.TipoCambio)) Then
                        exisAMC = False
                    Else
                        exisAMC = True
                    End If
                ElseIf (Elementos(1) = "PAYMENTTERMS") Then
                    If Not (UtilsAddAMC.ProcesaPaymentTerms(Elementos, Resp, _
                                                   addAMC)) Then
                        exisAMC = False
                    Else
                        exisAMC = True
                    End If
                ElseIf (Elementos(1) = "ALLOWANCECHARGE") Then
                    If Not (UtilsAddAMC.ProcesaPaymentTerms(Elementos, Resp, _
                                                   addAMC)) Then
                        exisAMC = False
                    Else
                        exisAMC = True
                    End If
                ElseIf (Elementos(1) = "LINEITEM") Then
                    If Not (UtilsAddAMC.ProcesaLineItem(Elementos, comprobante, Resp, _
                                                   addAMC, CuentArtAMC, currentCompr)) Then
                        exisAMC = False
                    Else
                        CuentArtAMC = CuentArtAMC + 1
                        exisAMC = True
                    End If
                ElseIf (Elementos(1) = "TOTALALLOWANCECHARGE") Then
                    If Not (UtilsAddAMC.ProcesaTotalAllowanceCharge(Elementos, Resp, addAMC)) Then
                        exisAMC = False
                    Else
                        exisAMC = True
                    End If
                ElseIf (Elementos(1) = "TAX") Then
                    If Not (UtilsAddAMC.ProcesaTax(Elementos, Resp, addAMC)) Then
                        exisAMC = False
                    Else
                        exisAMC = True
                    End If
                Else
                    ValidaCFDi.AgregaRespuesta("12", 0, "El contenido del documento TXT no es correcto. alguno de los indicadores no corresponde a la seccion 12.", Resp)
                End If
            Else
                ValidaCFDi.AgregaRespuesta("12", 0, "El contenido del documento TXT no es correcto. La seccion 12 no corresponde con el formato especificado", Resp)
            End If
        Catch ex As Exception
            ValidaCFDi.AgregaRespuesta("12", 0, ex.Message, Resp)
        End Try
    End Sub

    ''' <summary>
    ''' Metodo que valida la información de la Addenda COMA
    ''' </summary>
    ''' <param name="Elementos">Array de String que contiene los elementos de la sección</param>
    ''' <param name="Resp">Lista de RespuestaPremium a la que se añadiran los errores</param>
    ''' <param name="comprobante">Objeto de tipo Comprobante que contiene la información del CFDI</param>
    ''' <param name="exisComa">Vairable de tipo boolean que indica si es la primera sección de la addenda</param>
    ''' <param name="cuentArtComa">Variable que indica el numero de articulo</param>
    ''' <param name="addComa">Objeto que contendra la información de la addenda Coma</param>
    ''' <param name="tipoCFD">Variable que indica el  tipo de comprobante</param>
    ''' <remarks>Realiza consulta a base de datos para identificar que la addenda se encuentre activada</remarks>
    Public Shared Sub ValidaAddendaCOMA(ByVal Elementos As String(), ByRef Resp As List(Of RespuestaPremium), _
                                        ByVal comprobante As Comprobante, ByRef exisComa As Boolean, _
                                        ByRef cuentArtComa As Integer, ByRef addComa As Coma.ADD_HEADER, _
                                        ByVal tipoCFD As String)
        Dim UtiAddComa As New csUtilsAddendaComa
        Try
            If (Elementos(0) = "13") Then
                If (Elementos(1) = "CVEADD") Then
                    'Dim AddendaBE As AddendaBE = addendadal.getAddendaByDescripcion(Elementos(2), comprobante.Emisor.rfc, Conexion)
                    'If (AddendaBE Is Nothing) Then
                    '    ValidaCFDi.AgregaRespuesta("13", 2, "La Addenda " & Elementos(2) & "no se encuentra registrada.", Resp)
                    'End If
                    If Not (UtiAddComa.ProcesaConfig(Elementos, Resp)) Then
                        exisComa = False
                    Else
                        exisComa = True
                    End If
                ElseIf (Elementos(1) = "ENCABEZADO") Then
                    If Not (UtiAddComa.ProcesaEncabezado(Elementos, comprobante, _
                                                    Resp, tipoCFD, _
                                                    addComa)) Then
                        exisComa = False
                    Else
                        exisComa = True
                    End If
                ElseIf (Elementos(1) = "DETAIL") Then
                    If Not (UtiAddComa.ProcesaDetalle(Elementos, comprobante, Resp, addComa, cuentArtComa)) Then
                        exisComa = False
                    Else
                        cuentArtComa = cuentArtComa + 1
                        exisComa = True
                    End If
                Else
                    ValidaCFDi.AgregaRespuesta("13", 2, "El contenido del documento TXT no es correcto. alguno de los indicadores no corresponde a la seccion 13.", Resp)
                End If
            Else
                ValidaCFDi.AgregaRespuesta("13", 1, "El contenido del documento TXT no es correcto. alguna de las secciones no corresponde con el formato especificado", Resp)
            End If
        Catch ex As Exception
            ValidaCFDi.AgregaRespuesta("13", 0, ex.Message, Resp)
        End Try
    End Sub
End Class
